using UnityEngine;
using System.Collections;

public class ColorManager : MonoBehaviour {
	
	public Color myColor;
	
	public Transform colorPrefab;
	
	public bool readyColor;
	
	private ColorInfo colorCreate;
	private ColorInfo top;
	
	
	private ArrayList allCombinations = new ArrayList();
	
	IEnumerator Start()
	{
		addedColor(renderer.material.color,false,gameObject);
		
		gameObject.AddComponent("FadeIn");
		gameObject.GetComponent<FadeIn>().createFade(3f);
		
		rigidbody.isKinematic = true;
		
		gameObject.SendMessage("StartColorCombinationCounter",SendMessageOptions.DontRequireReceiver);
		
		yield return new WaitForSeconds(0.5f);
		
		rigidbody.isKinematic = false;
	}
	
	//Função de adição de cor
	public void addedColor(Color color,bool hasFirst,GameObject target)
	{
		//Cria uma nova informação de cor;
		colorCreate = new ColorInfo();
			
		//Define os valores da pilha;
		colorCreate.lastColor = myColor;
		colorCreate.thisColor = color;
		colorCreate.lastObject = top;
		
		//Elemento Top da pilha é igual ao criado
		top = colorCreate;
			
		//Declaração das informações da nova cor formada
		float r = color.r + myColor.r;
		float g = color.g + myColor.g;
		float b = color.b + myColor.b;
		
		//Verifica se é maior que 1, caso seja, iguala a 1
		
		if(r > 1) r = 1;
		
		if(g > 1) g = 1;
		
		if(b > 1) b = 1;
		
		
		
		if(r == 1 && g == 1 && b == 1)
		{
			AchievementItem ach = AchieveStorage.getInstance.getByName("Like The Floor");
			ach.Add();
			
			if(ach.Teste())
			{
				AchieveStorage.getInstance.UnlockAchieve(ach, Camera.mainCamera);
			}
		}
		
		//Define a nova informação da cor;
		myColor = new Color(r,g,b,1);
		
		//Muda os canais de audio de acordo com a nova cor
		AudioManager audioManager = GameObject.FindGameObjectWithTag("AudioManager").GetComponent<AudioManager>();
		audioManager.ChangeAudioChannels(myColor);

        AchieveStorage.getInstance.allColorsAchieve.TryRemoveColor(myColor);
				
		bool canCombination = true;
		
		foreach(Color currentColor in allCombinations)
		{
			if(myColor == currentColor)
			{	
				canCombination = false;
				break;
			}
		}
			
		if(canCombination)
		{
			allCombinations.Add(myColor);
			target.SendMessage("addCombination",SendMessageOptions.DontRequireReceiver);
		}
		
		//Seta a cor do material para a atual;
		renderer.material.color = myColor;
		StartCoroutine("reloadColors");

	}
	
	//Dropa Uma Cor
	public void DropColor()
	{
		//Caso a ultima informação de cor não seja vazia
		if(top.lastObject != null)
		{
			//Define a cor atual para a ultima informação e adciona ao renderer
			myColor = top.lastColor;
			
			//Muda os canais de audio de acordo com a nova cor
			AudioManager audioManager = GameObject.FindGameObjectWithTag("AudioManager").GetComponent<AudioManager>();
			audioManager.ChangeAudioChannels(myColor);
			
			renderer.material.color = top.lastColor;
			
			//Cria a instancia do cubo dropado, parenteia ele a sala em qual foi deixado e define a cor do objeto
			Transform colorRestore = Instantiate(colorPrefab,transform.position,colorPrefab.rotation) as Transform;
			colorRestore.parent = gameObject.GetComponent<CheckpointManager>().lastRoom;
 			colorRestore.renderer.material.color = new Color(top.thisColor.r,top.thisColor.g,top.thisColor.b,1);			
			colorRestore.gameObject.AddComponent("ColorInfo");
			top = top.lastObject;
			
		}

	}
	
	//Verifica se existe uma interseção de cores;
	public bool IntersectColor(Color color)
	{		
		if(color.r == myColor.r &&color.g == myColor.g && color.b == myColor.b)
		{
			return true;
		}
		
		return false;
	}
	
	//Pilha para Informação de Cores
	public class ColorInfo
	{
		public Color thisColor;
		public Color lastColor;
		public ColorInfo lastObject;
	}
	
		
	IEnumerator reloadColors()
	{
		yield return new WaitForSeconds(0);
		readyColor = true;	
	}


}
